<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>深拷贝与浅拷贝</title>
</head>

<body>

</body>
<script>
    //浅拷贝

    //1.Object.assign()方法 ：只能深拷贝第一层数据
    // let obj = {
    //     a: '1',
    //     b: '2',
    //     c:{
    //         c1: '3'
    //     }
    // };
    // console.log(obj);
    // let obj2 = Object.assign({}, obj);
    // obj2.a = 100;
    // obj2.c.c1 = 300;
    // console.log(obj);
    // console.log(obj2);

    //扩展运算符 : 只能深拷贝第一层数据
    // let obj = {
    //     a: '1',
    //     b: '2',
    //     c:{
    //         c1: '3'
    //     }
    // };
    // console.log(obj);
    // let obj1 = { ...obj };
    // obj1.a = 100;
    // obj1.c.c1 = 300;
    // console.log(obj);
    // console.log(obj1);

    //Array.prototype.slice()


    //Array.prototype.concat()


    //函数库lodash的_.clone方法


    //深拷贝

    //写一个递归，比较完美的解决方案
    // function DeepClone(data) {
    //     //Array.isArray ： 检查一个值是否为数组，返回布尔值
    //     const newData = Array.isArray(data) ? [] : {}
    //     for (let key in data) {
    //         if (data[key] && typeof data[key] === 'object') {
    //             newData[key] = DeepClone(data[key])
    //         } else {
    //             newData[key] = data[key]
    //         }
    //     }
    //     return newData
    // }


    //deepClone 深拷贝
    // function deepClone(source) {
    //     if (!source || typeof source !== 'object') {
    //         return source;
    //     }
    //     const targetObj = source.constructor === Array ? [] : {};
    //     for (const keys in source) {
    //         if (source.hasOwnProperty(keys)) {
    //             if (source[keys] && typeof source[keys] === 'object') {
    //                 targetObj[keys] = source[keys].constructor === Array ? [] : {};
    //                 targetObj[keys] = deepClone(source[keys]);
    //             } else {
    //                 targetObj[keys] = source[keys];
    //             }
    //         }
    //     }
    //     return targetObj;
    // }


    //用for…in实现遍历和复制
    // function deepClone(obj) {
    //     let result = typeof obj.splice === "function" ? [] : {};
    //     if (obj && typeof obj === 'object') {
    //         for (let key in obj) {
    //             if (obj[key] && typeof obj[key] === 'object') {
    //                 result[key] = deepClone(obj[key]);//如果对象的属性值为object的时候，递归调用deepClone,即在吧某个值对象复制一份到新的对象的对应值中。
    //             } else {
    //                 result[key] = obj[key];//如果对象的属性值不为object的时候，直接复制参数对象的每一个键值到新的对象对应的键值对中。
    //             }

    //         }
    //         return result;
    //     }
    //     return obj;
    // }

    //利用数组的Array.prototype.forEach进行copy
    // let deepClone = function (obj) {
    //     //Object.getPrototypeOf() 方法返回指定对象的原型（内部[[Prototype]]属性的值）。
    //     let copy = Object.create(Object.getPrototypeOf(obj));
    //     //**Object.getOwnPropertyNames()**方法返回一个由指定对象的所有自身属性的属性名
    //     //（包括不可枚举属性但不包括 Symbol 值作为名称的属性）组成的数组。
    //     let propNames = Object.getOwnPropertyNames(obj);
    //     propNames.forEach(function (items) {
    //         // 方法返回指定对象上一个自有属性对应的属性描述符。
    //         //（自有属性指的是直接赋予该对象的属性，不需要从原型链上进行查找的属性）
    //         let item = Object.getOwnPropertyDescriptor(obj, items);
    //         Object.defineProperty(copy, items, item);
    //     });
    //     return copy;
    // };

    //JSON转换方法
    // let obj = {
    //     a : '1',
    //     b : '2',
    //     c : {
    //         c1 : '3'
    //     }
    // }
    // console.log(obj);
    // let obj1 = JSON.parse(JSON.stringify(obj));
    // obj1.c.c1 = 300;
    // console.log(obj);
    // console.log(obj1);

    //loadash函数库
</script>

</html>